package com.example.study1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*List 与数组的转换
数组转List：Arrays.asList() 返回的是固定大小的列表，不能进行结构修改
List转数组：toArray() 方法可以转换为数组，推荐使用 toArray(T[] a) 指定类型
注意：Arrays.asList() 返回的列表与原始数组共享数据，修改会影响对方*/
public class ListArrayConversion {
    public static void main(String[] args) {
        // 创建一个字符串数组
        String[] array = {"One", "Two", "Three", "Four"};

        // 数组转List的两种方法：

        // 方法1: Arrays.asList() - 返回固定大小的列表（视图）
        List<String> fixedList = Arrays.asList(array);  // 将数组转换为固定大小的List
        System.out.println("Arrays.asList(): " + fixedList);

        // 重要注意事项：Arrays.asList()返回的列表大小固定，不能进行结构修改（添加/删除）
        // 下面的代码会抛出 UnsupportedOperationException 异常：
        // fixedList.add("Five");

        // 方法2: 创建新的ArrayList（可修改的列表）
        List<String> mutableList = new ArrayList<>(Arrays.asList(array));  // 通过构造函数创建可修改的ArrayList
        mutableList.add("Five");  // 现在可以安全地添加元素
        System.out.println("可修改列表: " + mutableList);

        // List转数组的三种方法：

        // 方法1: 转换为Object数组
        Object[] objectArray = mutableList.toArray();  // 将List转换为Object类型的数组
        System.out.println("Object数组: " + Arrays.toString(objectArray));

        // 方法2: 转换为指定类型的数组（参数为指定类型的空数组）
        String[] stringArray = mutableList.toArray(new String[0]);  // 传入空数组，返回正确类型的数组
        System.out.println("String数组: " + Arrays.toString(stringArray));

        // 方法3: 提供正确大小的数组（更高效的做法）
        String[] sizedArray = mutableList.toArray(new String[mutableList.size()]);  // 传入正确大小的数组
        System.out.println("正确大小的数组: " + Arrays.toString(sizedArray));
    }
}
/*运行结果：
Arrays.asList(): [One, Two, Three, Four]
可修改列表: [One, Two, Three, Four, Five]
Object数组: [One, Two, Three, Four, Five]
String数组: [One, Two, Three, Four, Five]
正确大小的数组: [One, Two, Three, Four, Five]*/